package com.cskaoyan.javase.file._1basic;

/**
 * @description: 路径名是什么?File类学习的前置知识点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 1.路径名是什么?
 *      在操作系统中,文件不可能是直接放在一起,而是用文件夹组织起来,那这样找到一个文件就必须通过各种文件夹/目录等
 *      所以路径名是操作系统中用于表示文件位置的字符串
 *      从分类上来说,路径名主要分为两类:
 *          1.绝对路径: 指的是可以唯一的,直接的确定某个文件的路径字符串
 *              根据操作系统的不同,绝对路径是不同的:
 *                  a.Windows有盘符的概念,win下的绝对路径,只要带着盘符,它都是绝对路径
 *                      比如c:\\1.txt,E:\\1\\学习资料.avi
 *                  b.类Unix操作系统,主要包括Unix和它的衍生系统就是Linux,MacOS,
 *                      这些系统的主要特征是没有盘符,有根目录的概念.根目录用左斜杠"/"表示
 *                      只要带着根目录/的路径都是绝对路径
 *                      比如: /1.txt,/1/2/3/4/奥特曼.mp4
 *
 *          2.相对路径: 指的是不能直接确定文件的路径字符串
 *                根据操作系统的不同,相对路径是不同的:
 *                  a.Windows有盘符的概念,win下的相对路径,只要不带着盘符,它都是相对路径
 *                      比如1.txt,1\2\1.txt
 *                  b.类Unix操作系统,主要包括Unix和它的衍生系统就是Linux,MacOS,
 *                      这些系统的主要特征是没有盘符,有根目录的概念.根目录用左斜杠"/"表示
 *                      只要不带着根目录/的路径都是相等路径
 *                      比如: 1.txt,1/2/3/4/奥特曼.mp4
 *
 *
 * 2.既然相对路径不能唯一确定某个文件,那么它的意义是什么?
 *      相对路径也是可以唯一确定文件,只需要知道相对路径,相对于谁
 *      比如1.txt这个相对路径,假如它相对于C:\\,于是就能够唯一确定一个文件C:\\1.txt 这就是相对路径的意义
 *      绝对路径在确定文件时,是比较安全的,是比较可控的,但同时也会是比较麻烦的,复杂的,不灵活的
 *      而使用相对路径,路径名就会写的更加简洁,也会更加灵活
 *          a.更加简洁:
 *              比如绝对路径:E:\idea_space\36th\Java36th\13-file\src\com\cskaoyan\javase\file\_1basic\Demo.java
 *              写相对路径的话只需要写Demo.java相对于E:\idea_space\36th\Java36th\13-file\src\com\cskaoyan\javase\file\_1basic\
 *          b.更加灵活:
 *              在相对路径中,可以使用"../"表示上级目录,这样相对路径就会更加灵活
 *      当然相对路径也会更加的危险,一旦外界条件发生变化,很容易获取不到文件
 *      所以实际开发中,两者都有应用,可能相对路径会更多一点
 *
 * 3.既然知道相对路径有相对于谁的概念,那么在idea里写代码,相对路径是相对于谁呢?
 *      获取相对路径: System.getProperty("user.dir");
 *      默认情况下是当前project中第一个创建的module的绝对路径
 *      当然这个东西是可以修改的,一般情况下默认即可
 *
 *
 * 4.不同的操作系统,路径分隔符是不同的,比如win使用反斜杠\,Linux使用左斜杠/,那么代码在不同环境下运行难道还需要频繁修改分隔符吗?
 *      在早期Java不成熟时,确实是这样,java还专门了静态成员变量通过本地方法去获取系统本地的分隔符
 *      但是现在java已经很成熟,使用任何分隔符,在任意系统上都是可以运行的
 *      所以,可以选择以下分隔符:
 *          1.\\ 双反斜杠表示单反斜杠
 *          2./ 单左斜杠
 *          3.// 双左斜杠
 *      三种方式任选其一,当然我推荐使用方式一,尤其需要注意不要使用单反斜杠,因为它表示转义字符
 *
 */
public class Demo {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
        String path = "c:\\1\\1\\1";
    }
}
